/**
 * 缩略图实现，将图片(jpg、bmp、png、gif等等)真实的变成想要的大小
 */
package com.crcc.common.util;

import com.crcc.common.constant.CommonConsts;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import javax.imageio.stream.MemoryCacheImageInputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.Date;

/*******************************************************************************
 * 缩略图类（通用） 本java类能将jpg、bmp、png、gif图片文件，进行等比或非等比的大小转换。 具体使用方法
 * compressPic(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度,是否等比缩放(默认为true))
 */
public class ImageBuffer {

    /**
     * 缩略图
     * @param multiFile 文件对象
     * @param abbPath 输出图路径
     * @param abbDomain 输出图路径
     * @param outputFileName 输出图文件名
     * @param width 输出图片宽
     * @param height 输出图片高
     * @param thumbnail true指定大小；
     * @param proportion 判断是否是等比缩放
     * @return
     */
    public static String compressPic(MultipartFile multiFile, String abbPath,String abbDomain, String outputFileName, int width, int height, boolean thumbnail, boolean proportion) {

        //获取当前日期
        String nowDate = DateUtil.formatDate(new Date(), CommonConsts.DATE_FORMAT_SIMPLE_CLEAN) + "/";

        try {

            String outputDir = abbPath + abbDomain + nowDate;

            File path = new File(outputDir);
            if (!path.exists()) {
                path.mkdirs();
                if (!OS.isWindows()) {
                    // 如果不是windows下，需要文件授权
                    Runtime.getRuntime().exec("chmod -R 777 " + path);
                }
            }
			/*	File outFile = new File(outputDir);
				if (!outFile.exists()) {
					outFile.mkdirs();
				}*/
            ByteArrayInputStream bais = new ByteArrayInputStream(multiFile.getBytes());
            MemoryCacheImageInputStream mciis = new MemoryCacheImageInputStream(bais);
            Image img = ImageIO.read(mciis);
            // 判断图片格式是否正确
            if (img.getWidth(null) == -1) {
                return null;
            } else {
                int newWidth;
                int newHeight;
                if (thumbnail) {
                    newWidth = width;
                    newHeight = height;
                } else {
                    // 判断是否是等比缩放
                    if (proportion == true && (img.getWidth(null) > 200 || img.getHeight(null) > 200)) {
                        // 为等比缩放计算输出的图片宽度及高度
                        double rate1 = ((double) img.getWidth(null)) / (double) width + 0.1;
                        double rate2 = ((double) img.getHeight(null)) / (double) height + 0.1;
                        // 根据缩放比率大的进行缩放控制
                        double rate = rate1 > rate2 ? rate1 : rate2;
                        newWidth = (int) (((double) img.getWidth(null)) / rate);
                        newHeight = (int) (((double) img.getHeight(null)) / rate);
                    } else {
                        newWidth = img.getWidth(null); // 输出的图片宽度
                        newHeight = img.getHeight(null); // 输出的图片高度
                    }
                }

                BufferedImage tag = new BufferedImage((int) newWidth, (int) newHeight, BufferedImage.TYPE_INT_RGB);

                Graphics2D g2d = tag.createGraphics();

                tag = g2d.getDeviceConfiguration().createCompatibleImage(newWidth, newHeight, Transparency.TRANSLUCENT);
                g2d.dispose();

                g2d = tag.createGraphics();
                Image from = img.getScaledInstance(newWidth, newHeight, Image.SCALE_AREA_AVERAGING);
                g2d.drawImage(from, 0, 0, null);
                g2d.dispose();
                ImageIO.write(tag, "png", new File(path.getPath() + File.separator + outputFileName));
                if (!OS.isWindows()) {
                    Runtime.getRuntime().exec("chmod -R 777 " + path + File.separator + outputFileName);
                }

            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return abbDomain + nowDate + outputFileName;
    }

}